# 通过列表生成式，我们可以直接创建一个列表。
# 但是，受到内存限制，列表容量肯定是有限的
# 如果我们仅仅需要访问前面几个元素，
# 那后面绝大多数元素占用的空间都白白浪费了
# 在Python中，这种一边循环一边计算的机制，称为生成器：generator。
# 要创建一个generator，有很多种方法。
# 第一种方法很简单，只要把一个列表生成式的[]改成()
L1 = [x*x for x in range(1,11)]
g=(x*x for x in range(1,11))
print(g)
for n in g:
	print(n)

# 著名的斐波拉契数列（Fibonacci），
# 除第一个和第二个数外，任意一个数都可由前两个数相加得到
def fib(max):
	n,a,b=0,0,1
	while n<max:
# 使用generator
		# print(b)
		yield b
		a,b = b,a+b
		n=n+1
	return 'done'
print(fib(6))
for n in fib(6):
	print(n)
# 捕获异常
g=fib(6)
while True:
	try:
		x =next(g)
		print('g:',x)
	except StopIteration as e:
		print('Generator return value:',e.value)
		break

# 杨辉三角
# 把每一行看做一个list，试写一个generator，不断输出下一行的list
#           1
#         1   1
#       1   2   1
#     1   3   3   1
#   1   4   6   4   1
# 1   5   10  10  5   1

def triangles():
	N = [1]
	while True:
		yield N
		N.append(0)
		N = [N[i-1] + N[i] for i in range(len(N))]

n = 0
for t in triangles():
    print(t)
    n = n + 1
    if n == 10:
        break
